/* 该 list 文件实现了一个双向循环链表 */


#ifndef _DYMLIST_H_
#define _DYMLIST_H_
#include <stdio.h>

struct student
{
    long long int ID;
    char sex[2];
    char name[16];
};
typedef struct student DYMListDataType;

struct _list_node
{
    DYMListDataType data;
    struct _list_node *next;    // 后续节点
    struct _list_node *prev;    // 前置节点
};

typedef struct _list
{
    size_t size;
    struct _list_node *buffer;  // 指向双向循环链表的首节点
} DYMList;

/*
* 函数功能：创建一个 List 并返回 
* return : 创建的 List
*/
DYMList DYMListCreateList();

/*
* 函数功能：在 list 头部添加一个元素
* @param list: 待操作链表
* @param elem: 待插入元素 
* return 操作结果: 1、操作成功返回 1；2、操作失败返回 0 
*/
int DYMListPushFront(DYMList *list,const DYMListDataType elem);

/*
* 函数功能：在 list 尾部添加一个元素
* @param list: 待操作链表
* @param elem: 待插入元素 
* return 操作结果: 1、操作成功返回 1；2、操作失败返回 0
*/
int DYMListPushBack(DYMList *list,const DYMListDataType elem);

/*
* 函数功能：在 list 头部删除一个元素
* @param list: 待操作链表
* @param buffer: 若 buffer 不为 NULL,则被删除元素的值将被写入 buffer;
* return 操作结果: 1、操作成功返回 1；2、操作失败返回 0
*/
int DYMListPopFront(DYMList *list, DYMListDataType *buffer);

/*
* 函数功能：在 list 尾部删除一个元素
* @param list: 待操作链表
* @param buffer: 若 buffer 不为 NULL,则被删除元素的值将被写入 buffer;
* return 操作结果: 1、操作成功返回 1；2、操作失败返回 0
*/
int DYMListPopBack(DYMList *list, DYMListDataType *buffer);  

/*
* 函数功能：从 list 中删除所有值为 elem 的元素, 并返回操作结果
* @param list: 待操作链表
* @param elem: 待删除元素
* @param equal: 比较两个 elem 是否相等的函数指针，该函数指针挂载的函数应当满足 1、a == b 返回 1；
                                                                          2、a != b 返回 0；
* return 操作结果: 1、操作成功返回 1；2、操作失败返回 0
*/
int DYMListDelete(DYMList *list,const DYMListDataType elem, int (*equal)(const DYMListDataType *a, const DYMListDataType *b));

/*
* 函数功能：判断 list 中是否包含值为 elem 的元素，若包含返回 1， 否则返回 0。
* @param list: 待操作链表
* @param elem: 待查找的元素
* @param equal: 比较两个 elem 是否相等的函数指针，该函数指针挂载的函数应当满足 1、a == b 返回 1；
                                                                          2、a != b 返回 0；
* return 操作结果: 1、操作成功返回 1；2、操作失败返回 0
*/
int DYMListContain(DYMList *list,const DYMListDataType elem, int (*equal)(const DYMListDataType *a, const DYMListDataType *b));

/*
* 函数功能：销毁一个链表 list
* @param list: 待操作链表
*/
void DYMListDestoty(DYMList *list);

void DYMListForeach(DYMList *list, void (*visit)(DYMListDataType* data));
void DYMListReverseForeach(DYMList *list, void (*visit)(DYMListDataType* data));

#endif // _DYMLIST_H_